table of contents
UNIX(7) | Podręcznik programisty Linuksa | UNIX(7) |
NAZWA¶
unix, PF_UNIX, AF_UNIX, PF_LOCAL, AF_LOCAL - gniazda lokalnej komunikacji międzyprocesowej
SKŁADNIA¶
#include <sys/socket.h>
#include <sys/un.h>
unix_socket = socket(PF_UNIX, type, 0);
error = socketpair(PF_UNIX, type, 0, int *sv);
OPIS¶
Rodzina gniazd PF_UNIX (znana również jako PF_LOCAL) służy do wydajnej komunikacji pomiędzy procesami na tej samej maszynie. Gniazda uniksowe mogą być albo anonimowe (tworzone przez socketpair(2)), albo skojarzone z plikiem typu gniazda. Linux wspiera również abstrakcyjną, niezależną od systemu plików przestrzeń nazw.
Prawidłowe typy, to SOCK_STREAM dla gniazd strumieniowych oraz SOCK_DGRAM dla gniazd datagramowych, które zachowują granice komunikatów. Gniazda uniksowe są zawsze niezawodne i nie zmieniaja kolejności datagramów.
Za pośrednictwem pomocniczych danych można poprzez gniazda uniksowe przekazywać do innych procesów deskryptory plików i uwierzytelnianie procesów.
FORMAT ADRESU¶
Adres gniazda uniksowego jest zdefiniowany jako nazwa pliku w systemie plików lub jako unikalny łańcuch w abstrakcyjnej przestrzeni nazw. Gniazda utworzone za pomocą socketpair(2) są anonimowe. Dla gniazd nieanonimowych adres docelowy można ustawić za pomocą connect(2). Adres lokalny można ustawić za pomocą bind(2). Gdy gniazdo jest połączone ale nie posiada jeszcze adresu lokalnego, jest mu przypisywany automatycznie wygenerowany adres w abstrakcyjnej przestrzeni nazw.
#define UNIX_PATH_MAX 108 struct sockaddr_un { sa_family_t sun_family; /* AF_UNIX */ char sun_path[UNIX_PATH_MAX]; /* ścieżka dostępu */ };
sun_family zawsze ma wartość AF_UNIX. sun_path zawiera zakończoną znakiem NULL nazwę ścieżki dostępu do gniazda w systemie plików. Gdy sun_path zaczyna się bajtem zerowym, odnosi się do abstrakcyjnej przestrzeni nazw, którą zarządza moduł protokołu Unix. Adres gniazda w tej przestrzeni nazw stanowią pozostałe bajty sun_path. Należy zauważyć, że nazwy w abstrakcyjnej przestrzeni nazw nie są zakończone znakiem NULL.
OPCJE GNIAZD¶
Ze względów historycznych następujące opcje gniazd są podawane przy typie SOL_SOCKET, pomimo że są one specyficzne dla PF_UNIX. Można je ustawić za pomocą setsockopt(2) a odczytać za pomocą getsockopt(2) podając SOL_SOCKET jako rodzinę gniazd.
- SO_PASSCRED
- Włącza otrzymywanie uwierzytelnień od procesu wysyłającego komunikat pomocniczy. Przy włączonej tej opcji i nie połączonym jeszcze gnieździe, unikalna nazwa gniazda z abstrakcyjnej przestrzeni nazw jest generowana automatycznie. Oczekiwany jest logiczny znacznik typu całkowitego.
KOMUNIKATY POMOCNICZE¶
Dane pomocnicze są wysyłane i odbierane za pomocą sendmsg(2) i recvmsg(2). Ze względów historycznych komunikaty pomocnicze poniższych typów są podawane przy typie SOL_SOCKET, pomimo że są one specyficzne dla PF_UNIX. Aby je wysłać należy ustawić pole cmsg_level struktury cmsghdr na SOL_SOCKET a pole cmsg_type na typ. Więcej informacji można znaleźć w cmsg(3).
- SCM_RIGHTS
- Odbieranie od innego procesu lub wysyłanie do niego zbioru otwartych deskryptorów plików. Porcja danych zawiera tablicę liczb całkowitych będących deskryptorami plików. Przekazane deskryptory plików zachowują się tak, jakby zostały utworzone za pomocą dup(2).
- SCM_CREDENTIALS
- Odbieranie lub wysyłanie uwierzytelnień uniksowych. Może służyć do autoryzacji. Uwierzytelnienia są przekazywane jako komunikat pomocniczy typu struct ucred.
struct ucred { pid_t pid; /* identyfikator procesu wysyłającego */ uid_t uid; /* ident. użytkownika procesu wysyłającego */ gid_t gid; /* ident. grupy procesu wysyłającego */ };
Jądro sprawdza uwierzytelnienia podane przez wysyłającego. Proces o efektywnym ID użytkownika równym 0 może podać wartości, które różnią się od jego własnych. W pozostałych przepadkach wysyłąjący musi podać swój własny identyfikator procesu (o ile nie ma ustawionego znacznika CAP_SYS_ADMIN), swój własny identyfikator użytkownika, efektywny identyfikator użytkownika lub ustawiony identyfikator użytkownika (o ile nie ma ustawionego znacznika CAP_SETUID), oraz swój własny identyfikator grupy, efektywny identyfikator grupy lub ustawiony identyfikator grupy (o ile nie ma ustawionego znacznika CAP_SETGID). Aby otrzymać komunikat typu struct ucred, dla gniazda musi być włączona opcja SO_PASSCRED.
WERSJE¶
SCM_CREDENTIALS oraz abstrakcyjna przestrzeń nazw zostały wprowadzone w Linuksie 2.2 i nie należy ich używać w przenośnych programach. (Niektóre systemy wywodzące się z BSD również wspierają przekazywanie uwierzytelnień, ale implementacje różnią się w szczegółach.)
UWAGI¶
W linuksowej implementacji, gniazda widoczne w systemie plików stosują się do uprawnień katalogu, w którym się znajdują. Ich właściciela, grupę oraz prawa dostępu można zmieniać. Gdy proces nie posiada praw zapisu i przeszukiwania (uruchamiania) do katalogu, wktórym tworzone jest gniazdo, jego utworzenie się nie powiedzie. Połączenie z obiektem gniazda wymaga praw odczytu/zapisu. Takie zachowanie różni się od zachowania wielu systemów wywodzących sie z BSD, które ignorują uprawnienia dla gniazd uniksowych. Programy przenośne ze względów bezpieczeństwa nie powinny polegac na tej cesze.
W trakcie łączenia się z gniazdem posiadającym nazwę pliku, tworzone jest plik specjalny gniazda w systemie plików, który musi zostać skasowany przez wywołującego, gdy już nie bedzie potrzebny (za pomocą unlink(2)). Staosuje się tu zwykła uniksowa składnia opóźnionego zamknięcia (ang. close-behind); gniazdo można skasować w dowolnym momencie, a zostanie ono ostatecznie usunięte z systemu plików po zamknięciu ostatniego odwołania do niego.
Aby przekazać desktyptory plików lub uwierzytelnienia trzeba wysłać/odebrać co najmniej jeden bajt danych.
Gniazda strumieniowe z domeny uniksowej nie obsługują zawiadomienia o danych autonomicznych.
BŁĘDY¶
- ENOMEM
- Brak pamięci.
- ECONNREFUSED
- Wywołano connect(2) dla obiektu gniazda, który nie nasłuchuje. Może się to zdarzyć, gdy zdalne gniazdo nie istnieje lub nazwa pliku nie odnosi się do gniazda.
- EINVAL
- Podano nieprawidłowy argument. Najczęstszą przyczyną jest brak ustawionego AF_UNIX w polu sun_type przekazywanych gniazdu adresów lub nieprawidłowy dla danej operacji stan gniazda.
- EOPNOTSUPP
- Operacja strumieniowa wywołana dla gniazda niestrumieniowego lub próba użycia opcji danych autonomicznych.
- EPROTONOSUPPORT
- Podanym protokołem nie jest PF_UNIX.
- ESOCKTNOSUPPORT
- Nieznany typ gniazda.
- EPROTOTYPE
- Typ gniazda zdalnego różni się od typu gniazda lokalnego (SOCK_DGRAM wobec SOCK_STREAM)
- EADDRINUSE
- Wybrany adres lokalny jest zajęty lub obiekt gniazda w systemie plików już istnieje.
- EISCONN
- Wywołano connect(2) dla już połączonego gniazda lub podano adres docelowy dla połączonego gniazda.
- ENOTCONN
- Operacja na gnieździe wymaga adresu docelowego, a gniazdo nie jest połączone.
- ECONNRESET
- Zdalne gniazdo zostało nieoczekiwanie zamknięte.
- EPIPE
- Zdalne gniazdo strumieniowe zostało zamknięte. Gdy włączone, wysyłany jest jednocześnie sygnał SIGPIPE. Można tego uniknąć przekazując znacznik MSG_NOSIGNAL do sendmsg(2) lub recvmsg(2).
- EFAULT
- Nieprawidłowy adres pamięci użytkownika.
- EPERM
- Wysyłający podał nieprawidłowe uwierzytelnienia w struct ucred.
Inne błędy mogą zostać wygenerowane przez podstawową warstwę gniazd lub przez system plików podczas tworzenia obioektu gniazda w systemie plików. Więcej informacji można znaleźć na odpowiednich stronach podręcznika.
ZOBACZ TAKŻE¶
recvmsg(2), sendmsg(2), socket(2), socketpair(2), cmsg(3), capabilities(7), socket(7)
2002-12-02 | Linux |